<?
/*
router class

@author Jelle Versele
@email me@jelleversele.be

deze class dient voor het ontrafelen van de url
en zorgt ervoor de het request object de juist controllerDir, controllerName,
controllerAction en parameters meekrijgt. De dispatcher kan dan de juiste files
laden aan de hand van het requestobject

*/
require_once('controller/dispatcher.class.php');

class controller_router{
	/*
		@define		teken voor het schijden van de url parts
	*/
	const SEPERATOR = '/';
	
	/*
		houdt de instantie van de klasse bij
		@var	controller_router
	*/
	private static $instance;
	
	/*
		houdt de instantie van de frontcontroller bij
		@var	controller_front
	*/
	private $frontController;
	
	private $dispatcher;
	
	
	private function __construct(controller_front $iFrontController){
		$this -> frontController = $iFrontController;
		$this -> dispatcher = controller_dispatcher::getInstance($this -> frontController);
	
	}
	
	
	/*
		instantie ophalen...
	*/
	public static function getInstance(controller_front $iFrontController){
	
		if(self::$instance == NULL){
			self::$instance = new self($iFrontController);
		}
		
		return self::$instance;
	}
	
	/*
		het eigenlijke bepalen van de module, controller, action en parameters vanuit de url
		die meegegeven wordt door het request object
	*/
	public function route(){
		
		// frontcontroller ophalen	
		
		$controllerDir = $this -> frontController -> getControllerDir();
		
		// request object ophalen
		$request = $this -> frontController -> getRequest();

		// url uit het request object halen
		$url = $request -> getUrl();
		// base url staat in de fornt controller opgeslagen
		$baseUrl = $this -> frontController -> getBaseUrl();
		// substringen zodat we enkel hetgeen hebben dat we kunnen gebruiken voor het routen
		$fullUrl = substr($url,strlen($baseUrl),strlen($url));
	
		
		
		
	
		
			
		
			// verdelen van string in array
			$fullUrl = trim($fullUrl,self::SEPERATOR);
			
			
			
			$dir = $this -> frontController -> getControllerDir();
			
			$request -> setModule('default');
			
			
			
			
				$urlParts =	explode(self::SEPERATOR,  $fullUrl);
				
						
				// zijn er meerdere controllerDirs?
				if(is_array($controllerDir)){
			
					
					if(array_key_exists(0, $urlParts)){
						
						
						// alle controllerDir vergelijken met het eerste urlPart 
						foreach($controllerDir as $key => $dir){
								
								
								// een controllerDir matcht met het urlPart
								if($key == $urlParts[0]){
									
								
									
									// module instellen dit is een mapnaam in de controllermap
									$request -> setModule($key);
									// eerste entry van de array verwijderen omdat dit de modulenaam was
									array_shift($urlParts);
									break;
								}
						}
						
						// als het urlPart niet matchte met 1 van de controllerDirs stellen we de default in
						if($request -> getModule() == NULL){
							$request -> setModule('default');
						}
					// in de url array geen entry's bevat moeten we ook de default dir instellen	
					}else{
						
						$request -> setModule('default');
						
					}
					
				
				}
				// einde van het instellen van de controllerdirs
				
				
				
				/*
					vanaf hier wordt de controller ingesteld
				*/
				
				
				// eerst kijken we of er nog entry's in de array zitten
				
				if(array_key_exists(0, $urlParts)){
					// als dit het geval is kunnen we dit 
					// voorloping istellen als controller
					$request -> setController($urlParts[0]);
				}else{
					// anders stellen we de default controller in
					$request -> setController($this -> frontController -> getDefaultController());
				}
				
				// nu gaan we kijken of de controller wel bestaat
				
				if($this -> dispatcher -> checkController($request)){
					// als het een corecte controller was dan deleten we deze entry 	
					array_shift($urlParts);
				
				}else{
					// anders schuiven we de foutieve entry door naar de controllerAction
					$request -> setControllerAction($request -> getController());
					// en we stellen de default controller in
					$request -> setController($this -> frontController -> getDefaultController());
				}
				
				
				
				/* 
				
					de actie instellen
					
					werkt exact hetzelfde als hierboven
				
				*/
				
				
				if(array_key_exists(0, $urlParts)){
					$request -> setControllerAction($urlParts[0]);
				}else{
					$request -> setControllerAction($this -> frontController -> getDefaultAction());
				}
				
				
				
				if($this -> dispatcher -> checkAction($request)){
				
					array_shift($urlParts);
				
				}else{
			
					$request -> setControllerAction($this -> frontController -> getDefaultAction());
					
				}
				
				
				/*
				 	
					resterende array entry's zijn parameters
				
				*/
				
				
				$request -> setParams($urlParts);
				
			
				
			}		

		
	

}


?>